﻿#define _CRT_SECURE_NO_WARNINGS

//#include<iostream>
//using namespace std;
////引用传参
////x，y是a，b的别名
//void Swap1(int& x, int& y)
//{
//	int tmp = x;
//	x = y;;
//	y = tmp;
//}
////指针版本
//void Swap2(int* x, int* y)
//{
//	int tmp = *x;
//	*x = *y;
//	*y = tmp;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	Swap1(a, b);
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//
//	int c = 1;
//	int d = 2;
//	Swap2(&c, &d);
//	cout << "c = " << c << endl;
//	cout << "d = " << d << endl;
//	return 0;
//}
//
//
//
//
//#include<iostream>
//using namespace std;
//
//int main()
//{
//	const int a = 10;
//	//int& ra = a;
//	// 编译报错：error C2440: “初始化”: 无法从“const int”转换为“int &”
//	// 这里引用是对a访问权限的放大
//	
//	//正确写法：权限平移（引用⼀个const对象，必须用const引用）
//	const int& ra = a;
//	//a++;
//	// 编译报错：error  C3892: “a”: 不能给常量赋值
//	//ra++;
//	// 编译报错：error C3892: “ra”: 不能给常量赋值
//
//	//正常的赋值拷贝，不涉及到权限的放大缩小
//	int rra = a;
//	rra++;
//	
//	cout << "a = " << a << endl;
//	cout << "ra = " << ra << endl;
//	cout << "rra = " << rra << endl;
//
//	int b = 20;
//	const int& rb = b;
//	// 这里引用是对b访问权限的缩小
//	// 编译报错：error C3892: “rb”: 不能给常量赋值
//	//rb++;//rb const修饰
//	b++;//正常
//	cout << "b = " << b << endl;
//	cout << "rb = " << rb << endl;
//	return 0;
//}

//typedef struct ListNode
//{
//	int val;
//	struct ListNode* next;
//}LTNode, * PNode;
//
////LTNode就是结构体，这里PNode也就是一个指针变量——LTNode*类型
//// 指针变量也可以取别名，LTNode*& phead就是给指针变量取别名
//// 这样就不需要使用二级指针，简化了程序
//// 转换过程
////void ListPushBack(LTNode** phead, int x)
////void ListPushBack(LTNode*& phead, int x)
//void ListPushBack(PNode& phead, int x)
//{
//	PNode newnode = (PNode)malloc(sizeof(LTNode));
//	if (newnode == NULL)
//	{
//		perror("malloc fail");
//		exit(1);
//	}
//	newnode->val = x;
//	newnode->next = NULL;
//	if (phead == NULL)
//	{
//		phead = newnode;
//	}
//	else
//	{
//		//...
//	}
//}
//
//int main()
//{
//	PNode plist = NULL;
//	ListPushBack(plist, 1);
//	return 0;
//}


//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 10;
//	const int& ra = 30;
//	// 编译报错: “初始化”: 无法从“int”转换为“int &”
//	//int& rb = a * 3;   //（a*3）结果保存在⼀个临时对象中，临时对象具有常性（不能被修改）
//	//正确使用：const修饰
//	const int& rb = a * 3;
//	double d = 12.34;
//	// 编译报错：“初始化”: 无法从“double”转换为“int &”
//	//int& rd = d; //类型转换产生临时对象，临时对象具有常性（不能被修改）
//	//正确使用：const修饰
//	const int& rd = d;
//	//不进行类型转换
//	double& rdd = d;
//	return 0;
//}


//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 10;
//	int& ra = a;
//
//	int b = 100;
//	int* rb = &b;
//	return 0;
//}


#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
	//调用f(int x)
	f(NULL);
	//我们认为NULL是空指针
	// 本想通过f(NULL)调用指针版本的f(int*)函数
	// 但是由于NULL被定义成0，调用了f(int x)，因此与程序的初衷相悖。
	
    //f((void*)NULL);
	// 编译报错：error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型

	//正确调用指针版本：
	f((int*)NULL);//强制类型转换
    f(nullptr);//使用特殊关键字nullptr，nullptr可以转换成任意其他类型的指针类型
	return 0;
}